package com.ck.ips.service.program;

import com.ck.common.model.OperationResult;
import com.ck.common.model.Program;
import com.ck.core.constant.program.ProgramStatusEnum;
import com.ck.ips.model.vo.program.DeviceAddAndReducedStatisticVO;
import com.ck.ips.model.vo.program.ProgramPlayListVO;

import java.util.List;

/**
 * @author LinQiang
 * @version 1.0
 * @Description 节目Service
 * @date 2019/4/29 14:24
 **/
public interface ProgramService {

    OperationResult deleteByPrimaryKey(Long programId);

    OperationResult insert(Program record);

    Program selectByPrimaryKey(Long programId);

    /**
     * 节目分页查询
     *
     * @param programName   节目名称
     * @param programStatus 节目状态
     * @param programOrigin 节目来源
     * @param deviceGroupId 投放区域（多个英文逗号隔开）
     * @param deviceType    终端类型
     * @param pageNum       当前页
     * @param pageSize      每页条数
     * @param brandId       品牌id
     * @return Page
     */
    OperationResult listByPage(String programName, Integer programStatus, String programOrigin, String deviceGroupId,
                               String deviceType, Integer pageNum, Integer pageSize, Integer brandId);
//
//    /**
//     * 保存节目点位信息
//     *
//     * @param programVersion 节目版本号
//     * @param deviceCodes    设备序列号（多个以英文逗号隔开）
//     * @return OperationResult
//     */
//    OperationResult saveBasicInfoAndProgramPointer(String programVersion, String deviceCodes);

    /**
     * 素材JSON信息 （key为分辨率，value为素材信息）
     *
     * @param programVersion   节目版本号
     * @param programName      节目名称
     * @param deviceType       设备类型
     * @param deviceResolution 分辨率
     * @param putinLevel       投放级别
     * @param putinStartTime   投放开始时间
     * @param putinEndTime     投放结束时间
     * @param putinLimit       投放限制
     * @param sourceJson       素材JSON（key:分辨率， value:素材JSON数组）
     * @param deviceCodes      点位（设备序列号哦，多个英文逗号隔开）
     * @param checkPointer     是否检查点位（true检查， false不检查）
     * @param checkSource      是否检查素材（true检查， false不检查）
     * @param brandId          品牌id
     * @return OperationResult
     */
    OperationResult saveBasicInfoAndPointerAndSource(String programName, String deviceType, String deviceResolution,
                                                     Integer putinLevel, String putinStartTime,
                                                     String putinEndTime, String putinLimit, String programVersion,
                                                     String sourceJson, String deviceCodes, Boolean checkPointer, Boolean checkSource, Long brandId);

//    /**
//     * 普通发布节目（先选素材后选点）
//     *
//     * @param programVersion 节目版本号
//     * @param deviceCodes    设备序列号（多个以英文逗号隔开）
//     * @return OperationResult
//     */
//    OperationResult normalPublish(String programVersion, String deviceCodes);

    /**
     * 快速发布节目（先选点后选苏素材）
     *
     * @param programVersion 节目版本号
     * @param deviceCodes    终端序列号（多个英文逗号隔开）
     * @return OperationResult
     */
    OperationResult publish(String programVersion, String deviceCodes);

    /**
     * 审核通过节目
     *
     * @param programVersion 节目版本号
     * @return OperationResult
     */
    OperationResult pass(String programVersion);

    /**
     * 审核拒绝节目
     *
     * @param programVersion 节目版本号
     * @param rejectReason   拒绝理由
     * @return OperationResult
     */
    OperationResult reject(String programVersion, String rejectReason);

    /**
     * 从终端发布节目
     *
     * @param programVersions 节目版本号（多个英文逗号隔开）
     * @param deviceCodes     设备序列号（多个英文逗号隔开）
     * @return OperationResult
     */
    OperationResult fastPublishByProgramAndPointer(String programVersions, String deviceCodes);

    /**
     * 根据终端类型和分辨率筛选出可选的节目列表分页
     *
     * @param deviceCodes    设备序列号
     * @param programName    节目名称
     * @param origin         来源
     * @param deviceGroupIds 终端组（区域），多个英文逗号隔开
     * @return OperationResult
     */
    OperationResult getProgramByDevices(String deviceCodes, String programName, String origin, String deviceGroupIds);

    /**
     * 根据节目版本号查询节目详情
     *
     * @param customerName   客户名称
     * @param programVersion 节目版本号
     * @return OperationResult
     */
    OperationResult getDetail(String customerName, String programVersion);

    /**
     * 获取节目投放区域，下发详情，下载详情列表分页
     *
     * @param programVersion 节目版本号
     * @param deviceName     设备名称
     * @param deviceCode     设备序列号
     * @param pageNum        当前页
     * @param pageSize       每页条数
     * @return OperationResult
     */
    OperationResult getDevicesByPage(String programVersion, String deviceName, String deviceCode, Integer pageNum, Integer pageSize);

    /**
     * 获取节目统计信息
     * 统计投放终端组数量，终端数量，素材数量，投放时间，
     * 下发情况（已下发成功：X个终端；发送中：X个终端；发送失败：X个终端）
     * 下载情况（已下载成功：X个终端；下载中：X个终端；下载失败：X个终端）
     *
     * @param programVersion 节目版本号
     * @return OperationResult
     */
    OperationResult getStatisticsInfo(String programVersion);

    /**
     * 增播
     * 只能选择一个终端
     *
     * @param deviceType       设备类型
     * @param deviceResolution 设备分辨率
     * @param deviceCode       设备序列号
     * @param programName      节目名称
     * @param putinLevel       投放级别
     * @param putinLimit       投放限制
     * @param putinStartTime   投放开始时间
     * @param putinEndTime     投放结束时间
     * @param json             素材信息（json数组字符串）
     * @param brandId          品牌id
     * @return OperationResult
     */
    OperationResult added(String deviceType, String deviceResolution, String deviceCode, String programName, Integer putinLevel,
                          String putinLimit, String putinStartTime, String putinEndTime, String json, Long brandId);

    /**
     * 减播
     * 只能选择一个终端， 减播的素材只是在终端不播放，后台节目中素材不变，因为可能多个终端在播放
     *
     * @param deviceCode 设备序列号
     * @param json       需要减播的素材数组json字符串（属性包括：节目版本号，素材名称，素材url）
     * @return OperationResult
     */
    OperationResult reduce(String deviceCode, String json);

    /**
     * 根据终端获取终端当前在播和等待播放的节目素材列表
     *
     * @param deviceCode 设备序列号
     * @param sourceName 素材名称
     * @return OperationResult
     */
    OperationResult getPlayListByDeviceCode(String deviceCode, String sourceName);

    /**
     * 节目下线
     *
     * @param programVersion 节目版本号
     * @return OperationResult
     */
    OperationResult offline(String programVersion);

    /**
     * api新增节目
     * 素材JSON格式：
     *
     * @param customerName   客户名称
     * @param deviceCodes    设备序列号（多个已英文逗号分割）
     * @param programName    节目名称
     * @param putinLevel     投放级别
     * @param putinLimit     投放限制
     * @param putinStartTime 投放开始时间
     * @param putinEndTime   投放结束时间
     * @param sources        素材JSON信息 （key为分辨率，value为素材信息）
     * @return OperationResult
     */
    OperationResult apiAdd(String customerName, String deviceCodes, String programName, Integer putinLevel, String putinLimit, String putinStartTime,
                           String putinEndTime, String sources);

    /**
     * 获取待播放和播放中的节目列表
     *
     * @return List
     */
    List<Program> getToPlayAndPlayingPrograms();

    /**
     * 根据节目版本号统计设备数
     *
     * @param programVersion 节目版本号
     * @return 条数
     */
    int countDeviceProgramByProgramVersion(String programVersion);

    /**
     * 批量更新节目状态
     *
     * @param newStatus          新状态
     * @param programVersionList 节目版本号集合
     * @param updateTime         更新时间
     */
    void batchUpdateStatus(ProgramStatusEnum newStatus, List<String> programVersionList, Long updateTime);

    /**
     * 解绑时删除节目相关信息
     *
     * @param deviceCodeList
     */
    void batchDeleteByDeviceCodeForDeviceUnit(List<String> deviceCodeList);

    /**
     * 根据终端类型和分辨率筛选出可选的节目所投放的终端
     *
     * @param deviceCodes 设备序列号（多个英文逗号隔开）
     * @return OperationResult
     */
    OperationResult getDeviceSelect(String deviceCodes);

    /**
     * 查询列表
     *
     * @param customerName API客户名称
     * @param pageNum
     * @param pageSize
     * @return OperationResult
     */
    OperationResult list(String customerName, Integer pageNum, Integer pageSize);

    /**
     * 删除节目
     *
     * @param programVersion 节目版本号
     * @return OperationResult
     */
    OperationResult delete(String programVersion);

    /**
     * 复制节目
     *
     * @param programVersion 节目版本号
     * @return OperationResult
     */
    OperationResult copy(String programVersion);

    /**
     * 获取终端当前的素材播放列表
     * 待播放的和正在播放的
     *
     * @param deviceCode 设备序列号
     * @param sourceName 素材名称
     * @return OperationResult
     */
    OperationResult getCurrentSourcesByDeviceCode(String deviceCode, String sourceName);

    /**
     * 获取终端当前的素材播放列表
     * 待播放的和正在播放的
     *
     * @param deviceCode 设备序列号
     * @param sourceName 素材名称
     * @return OperationResult
     */
    List<ProgramPlayListVO> getSimpleCurrentSourcesByDeviceCode(String deviceCode, String sourceName);

    /**
     * 获取终端当前的素材统计信息
     * 待播放的和正在播放的
     *
     * @param deviceCode 设备序列号
     * @return OperationResult
     */
    OperationResult getCurrentSourcesStaticInfoByDeviceCode(String deviceCode);

    /**
     * 根据终端统计增播和减播次数
     *
     * @param deviceCodeList 设备序列号
     * @return List
     */
    List<DeviceAddAndReducedStatisticVO> getAddedAndReducedStatisticInfoByDeviceCodes(List<String> deviceCodeList);

    /**
     * 获取所有节目投放的终端组
     *
     * @return OperationResult
     */
    OperationResult getDeviceGroupSelect();

    /**
     * 检查节目素材是否完整
     *
     * @param programVersion 节目版本号
     * @return OperationResult
     */
    OperationResult checkSource(String programVersion);

    /**
     * 检查节目名称
     *
     * @param programVersion 节目版本号
     * @param programName    节目名称
     * @return OperationResult
     */
    OperationResult checkName(String programVersion, String programName);

    /**
     * 根据终端获取增播日志列表
     *
     * @param deviceCode 终端序列号
     * @return OperationResult
     */
    OperationResult getAddedSourcesByDeviceCode(String deviceCode);

    /**
     * 审核通过节目
     *
     * @param programVersion 设备序列号
     * @param optType        操作类型（pass：通过， reject:驳回）
     * @param rejectReason   驳回原因
     * @return OperationResult
     */
    OperationResult auth(String programVersion, String optType, String rejectReason);

    /**
     * 更新节目播放排序
     * @param programVersion 节目版本号
     * @param rank 播放排序
     * @return
     */
    OperationResult updateProgramRank(String programVersion, Long rank);
}